package com.linyaonan.leetcode.easy._605;

/**
 * 假设有一个很长的花坛，一部分地块种植了花，另一部分却没有。可是，花不能种植在相邻的地块上，它们会争夺水源，两者都会死去。
 * <p>
 * 给你一个整数数组 flowerbed 表示花坛，由若干 0 和 1 组成，其中 0 表示没种植花，1 表示种植了花。另有一个数 n ，能否在不打破种植规则的情况下种入 n 朵花？能则返回 true ，不能则返回 false 。
 * <p>
 * <p>
 * <p>
 * 示例 1：
 * <p>
 * 输入：flowerbed = [1,0,0,0,1], n = 1
 * 输出：true
 * 示例 2：
 * <p>
 * 输入：flowerbed = [1,0,0,0,1], n = 2
 * 输出：false
 * <p>
 * <p>
 * 提示：
 * <p>
 * 1 <= flowerbed.length <= 2 * 10^4
 * flowerbed[i] 为 0 或 1
 * flowerbed 中不存在相邻的两朵花
 * 0 <= n <= flowerbed.length
 *
 * @author: Lin
 * @date: 2024/3/12
 */
public class CanPlaceFlowers {

    // 1 0 (0>1) 0 1
    //1 0 0 0 0 1 0 1
    public boolean canPlaceFlowers(int[] flowerbed, int n) {
        if (n == 0) {
            return true;
        }
        if (flowerbed.length == 1) {
            if (flowerbed[0] == 0) {
                return n <= 1;
            } else {
                return false;
            }
        }

        int[] newI = new int[flowerbed.length + 2];
        newI[0] = 0;
        newI[newI.length - 1] = 0;
        System.arraycopy(flowerbed, 0, newI, 1, flowerbed.length);

        // 转换为求多少个连续三个0,一但找到三个连续0后，可以将最后一个0统计到连续的0中
        // 收尾都默认前后增加一个0
        int c = 0;
        for (int i = 0; i < newI.length - 2; ) {
            if (newI[i] == 0 && newI[i + 1] == 0 && newI[i + 2] == 0) {
                c++;
                i += 2;
            } else {
                i++;
            }
        }

        return n <= c;
    }

}
